package com.erlang.sql.jdbc;

import com.erlang.sql.utils.JDBCUtils;
import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * @author ZGQ
 */
public class PreparedStatementDemo {

  /**
   * SQL注入问题
   * 问题还原:
   *    由于没有对用户输入进行充分检查，而SQL又是拼接而成，在用户输入参数时，在参数中添加一些SQL 关键字，达到改变SQL运行结果的目的，也可以完成恶意攻击。
   *  问题原因:
   *    之所以有sql注入的问题，无非是在参数中设置了一些特殊字符，使sql语句在拼接这些参数的时候因为特殊字符的原因改变了sql语句原来的规则。
   * 处理方案:
   *    使用PreparedStatement 解决SQL注入问题，运行在SQL中参数以 ? 占位符的方式表示。
   */

  @Test
  public void ZhuRu2() {
    // 需求: 根据用户名和密码 查询用户信息(只知道用户名,不知道密码)
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
      // 获得连接
      conn = JDBCUtils.getConnection();
      // 获得发送sql的对象
      stmt = conn.createStatement();
      // 执行sql 获得结果
      String uname = "zhangsan' -- ";
      String upwd = "skjflskfjslfksf";
      String sql = "select * from jd_user where username='" + uname + "' and password='" + upwd + "'";
     //上述sql语句等同于sql="select * from user where username='zhangsan' -- ' and password='skjflskfjslfksf'";
      System.out.println(sql);
      rs = stmt.executeQuery(sql);
      // 处理结果
      if (rs.next()) {
        int id = rs.getInt("id");
        String username = rs.getString("username");
        String pwd = rs.getString("password");

        System.out.println(id + ":::" + username + "===" + pwd);
      } else {
        System.out.println("没有查到对应的用户信息!");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 释放资源
      JDBCUtils.release(conn, stmt, rs);
    }
  }

  /**
   * 使用PreparedStatement 解决SQL注入问题，运行在SQL中参数以 ? 占位符的方式表示。
   */
  @Test
  public void ZhuRuResolve01() {
    // 需求: 根据用户名和密码 查询用户信息
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try {
      // 获得连接
      conn = JDBCUtils.getConnection();
      // 获得发送sql的对象
      String sql = "select * from jd_user where username=? and password=?";
      pstmt = conn.prepareStatement(sql);
      // 如果有问号,需要 设置参数,注意:下标从1开始
      pstmt.setString(1, "zhangsan");
      pstmt.setString(2, "123");
      // 执行sql 获得结果
      rs = pstmt.executeQuery();
      // 处理结果
      if (rs.next()) {
        int id = rs.getInt("id");
        String username = rs.getString("username");
        String pwd = rs.getString("password");

        System.out.println(id + ":::" + username + "===" + pwd);
      } else {
        System.out.println("没有查到对应的用户信息!");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.release(conn, pstmt, rs);
    }
  }

  @Test
  public void insert() {
    // 需求: 插入 用户 liuyan 123
    Connection conn = null;
    PreparedStatement pstmt = null;

    try {
      // 获得连接
      conn = JDBCUtils.getConnection();
      // 获得发送sql的对象
      String sql = "insert into jd_user values(null, ?, ?)";
      pstmt = conn.prepareStatement(sql);
      // 如果有问号 必须设置
      pstmt.setString(1, "aqi");
      pstmt.setString(2, "123");
      // 执行sql 获得结果
      int sum = pstmt.executeUpdate();
      // 处理结果
      System.out.println(sum);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      JDBCUtils.release(conn, pstmt,null);
    }
  }

}
